package com.huatai.vba.common.utils;

import java.io.File;
import java.util.List;

import com.google.common.collect.Lists;

public class FileDemo07 {

	public static void main(String[] args) {
		// 在此目录中找文件
		String baseDIR = "E:/新建文件夹";
		// 找扩展名为txt的文件
		String fileName = "*20161213*";
		List<File> resultList = findFiles(baseDIR, fileName);
		System.out.println(resultList.size());
		if (resultList.size() == 0) {
			System.out.println("No File Fount.");
		} else {
			for (int i = 0; i < resultList.size(); i++) {
				System.out.println(resultList.get(i));// 显示查找结果。
			}
		}

	}

	/**
	 * 递归查找文件
	 * 
	 * @param baseDirName
	 *            查找的文件夹路径
	 * @param targetFileName
	 *            需要查找的文件名
	 * @param fileList
	 *            查找到的文件集合
	 */
	public static List<File> findFiles(String baseDirName, String pattern) {
		List<File> fileList = Lists.newArrayList();
		File baseDir = new File(baseDirName); // 创建一个File对象
		if (!baseDir.exists() || !baseDir.isDirectory()) { // 判断目录是否存在
			System.out.println("文件查找失败：" + baseDirName + "不是一个目录！");
		}
		String tempName = null;
		// 判断目录是否存在
		File tempFile;
		File[] files = baseDir.listFiles();
		for (int i = 0; i < files.length; i++) {
			tempFile = files[i];
			if (tempFile.isDirectory()) {
				fileList.addAll(findFiles(tempFile.getAbsolutePath(), pattern));
			} else if (tempFile.isFile()) {
				tempName = tempFile.getName();
				if (wildcardMatch(tempName, pattern)) {
					// 匹配成功，将文件名添加到结果集
					fileList.add(tempFile.getAbsoluteFile());
				}
			}
		}
		return fileList;
	}

	/**
	 * 通配符匹配
	 * 
	 * @param pattern
	 *            通配符模式
	 * @param str
	 *            待匹配的字符串
	 * @return 匹配成功则返回true，否则返回false
	 */
	private static boolean wildcardMatch(String fileName, String pattern) {
		int patternLength = pattern.length();
		int strLength = fileName.length();
		int strIndex = 0;
		char ch;
		for (int patternIndex = 0; patternIndex < patternLength; patternIndex++) {
			ch = pattern.charAt(patternIndex);
			if (ch == '*') {
				// 通配符星号*表示可以匹配任意多个字符
				while (strIndex < strLength) {
					if (wildcardMatch(fileName.substring(strIndex), pattern.substring(patternIndex + 1))) {
						return true;
					}
					strIndex++;
				}
			} else if (ch == '?') {
				// 通配符问号?表示匹配任意一个字符
				strIndex++;
				if (strIndex > strLength) {
					// 表示str中已经没有字符匹配?了。
					return false;
				}
			} else {
				if ((strIndex >= strLength) || (ch != fileName.charAt(strIndex))) {
					return false;
				}
				strIndex++;
			}
		}
		return (strIndex == strLength);
	}
}